#include <iostream>

using namespace std;

// 单行注释

/*
多行注释
*/

/**
 * 文档注释
*/

/**
 * 数据类型
*/
void dataType(){
    // 字符，占用空间 = 1
    char char1 = 'a';
    // 宽字符，占用空间 = 2 或 4
    wchar_t char2 = 'b';
    // 布尔，占用空间 = 1
    bool flag = false;
    // 整数，占用空间 = 4
    int number = 1;
    // 浮点，占用空间 = 4
    float floatValue = 10.1f;
    
    /*
    ************************ 补充 ******************
    */
    // 根据值进行类型推理
    auto number2 = number;
    // 16 位 Unicode 字符类型（C++11 引入），占用空间 = 2
    char16_t char3 = 'a';
    // 32 位 Unicode 字符类型（C++11 引入），占用空间 = 4
    char32_t char4 = 'a';
    // 	获取表达式的类型
    int number3 = 5;
    decltype(number3) y = 20;
    // 	空指针常量
    int* ptr = nullptr;
    //  初始化列表类型
    std::initializer_list<int> list = {1,2,3};
    //  元组类型，可以存储多个不同类型的值
    std::tuple<int,float,char> t = {1,0.2,'8'}; 

    cout 
    << "字符：" << char1 << "\n宽字符：" << char2 << "\n布尔：" << flag << "\n整数：" 
    << number <<  "\n浮点：" << floatValue <<  "\n根据值进行推理：" << number2 
    << "\n16char：" << char3 << "\n32char：" << char4  
    << "\n获取表达式的类型：" << y << "\n空指针常量：" << ptr  
    << endl;


    for(int num: list){
        cout << "list:" << num << endl;
    }
    
    try{
        cout << "tuple:" << std::get<0>(t) << endl;
        cout << "tuple:" << std::get<1>(t) << endl;
        cout << "tuple:" << std::get<2>(t) << endl;
    } catch(std::out_of_range &e){
        cout << "tuple:" << e.what() << endl;
    }

    cout << "helloworld，所占用的字节为：" << sizeof(string) << endl;
    
}

/**
 * 修饰符
*/
void modifier(){
    // 	表示有符号类型（默认），占用空间 = 1
    signed int number1 = -10;
    // 	表示无符号类型，占用空间 = 1
    unsigned int number2 = 10;
    // 	表示短整型，占用空间 = 2
    short int number3 = 111;
    // 	表示长整型，占用空间 = 	4 或 8
    long int number4 = 11111111;
    //  表示常量，值不可修改
    const int number5 = 123456;
    //  表示变量可能被意外修改，禁止编译器优化
    volatile int number6 = 123;
    cout << number1 << endl;
    cout << number2 << endl;
    cout << number3 << endl;
    cout << number4 << endl;
    cout << number5 << endl;
    cout << number6 << endl;
}

/**
 * 派生数据类型
*/
void derivedDataType(){
    // 数组，相同类型元素的集合
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    // 指针，存储变量内存地址的类型
    int *p = arr;
    // 引用，变量别名
    int& ref = arr[0];
    
    // 枚举，值默认从0开始递增（RED=0,GREEN=1,BLUE=5,YELLOW=6）
    enum  Color{
        RED,
        GREEN,
        BLUE = 5,
        YELLOW
    } c;
    c = YELLOW;
    cout << c << endl;
}

int main()
{   
    // dataType();
    // modifier();
    derivedDataType();
}
